package cn.com.blueInfo.bpm.person.request;

import cn.com.blueInfo.bpm.common.request.BaseDTO;
import cn.com.blueInfo.bpm.common.request.BaseQueryDTO;
import cn.com.blueInfo.bpm.person.enums.UserAccountMfaStatus;
import cn.com.blueInfo.bpm.person.enums.UserAccountStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;

/**
 * 员工账户表 接收参数机校验
 * @author suxch
 * @since 2025-08-24 01:39:52
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "员工账户 接收参数及校验")
public class UserAccountDTO extends BaseDTO {

    /** 用户基本信息ID */
    @NotNull(message = "用户基本信息ID 不能为空")
    @Schema(description = "用户基本信息ID")
    private Long userBaseId;
    /** 登录名 */
    @NotBlank(message = "登录名 不能为空")
    @Schema(description = "登录名")
    private String loginName;
    /** 登录用手机号 */
    @Schema(description = "登录用手机号")
    private String loginMobile;
    /** 登录用邮箱 */
    @Schema(description = "登录用邮箱")
    private String loginEmail;
    /** 登录密码（密文） */
    @NotBlank(message = "登录密码 不能为空")
    @Size(min = 8, max = 20, message = "密码必须8-20位，包含数字、大小写字母、不能以数字开头")
    @Pattern(
            regexp = "^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])[A-Za-z][A-Za-z0-9!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]{7,19}$",
            message = "密码必须8-20位，包含数字、大小写字母，不能以数字开头"
    )
    @Schema(description = "登录密码（密文）")
    private String password;
    /** 密码过期时间（90天后提醒） */
    @Schema(description = "密码过期时间（90天后提醒）")
    private LocalDateTime passwordExpireTime;
    /** 帐号状态：0-禁用，1-正常，2-锁定 */
    @NotNull(message = "帐号状态 不能为空")
    @Schema(description = "帐号状态：0-禁用，1-正常，2-锁定")
    private UserAccountStatus accountStatus;
    /** 帐号锁定原因 */
    @Schema(description = "帐号锁定原因")
    private String lockReason;
    /** 最后登录时间 */
    @Schema(description = "最后登录时间")
    private LocalDateTime lastLoginTime;
    /** 最后登录IP，为兼容IPV6，长度39 */
    @Schema(description = "最后登录IP，为兼容IPV6，长度39")
    private String lastLoginIp;
    /** 连续登录失败次数 */
    @Schema(description = "连续登录失败次数")
    private Byte loginFailCount;
    /** 最后登录失败时间 */
    @Schema(description = "最后登录失败时间")
    private LocalDateTime loginFailTime;
    /** 多因素认证状态：0-未开启，1-已开启 */
    @Schema(description = "多因素认证状态：0-未开启，1-已开启")
    private UserAccountMfaStatus mfaStatus;
    /** 多因素认证密钥 */
    @Schema(description = "多因素认证密钥")
    private String mfaSecret;
    /** 账号有效期 */
    @Schema(description = "账号有效期")
    private LocalDateTime accountExpireTime;
    /** 登录设备 */
    @Schema(description = "登录设备")
    private String loginChannel;
    /** 租户ID，仅平台超管可操作 */
    @Schema(description = "租户ID，仅平台超管可操作")
    private Long tenantId;
    /** 租户系统ID，仅平台超管可操作 */
    @Schema(description = "租户系统ID，仅平台超管可操作")
    private Long applicationId;
    /** 创建人ID，仅平台超管可操作 */
    @Schema(description = "创建人ID，仅平台超管可操作")
    private Long createUserId;

    /**
     * 员工账户 接收分页查询参数
     * @author suxch
     * @since 2025-08-21 05:08:55
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @Schema(description = "员工账户 接收分页查询参数")
    public static class QueryDTO extends BaseQueryDTO {

        /** 用户基本信息ID */
        @Schema(description = "用户基本信息ID")
        private Long userBaseId;
        /** 登录名 */
        @Schema(description = "登录名")
        private String loginName;
        /** 登录用手机号 */
        @Schema(description = "登录用手机号")
        private String loginMobile;
        /** 登录用邮箱 */
        @Schema(description = "登录用邮箱")
        private String loginEmail;
        /** 登录密码（密文） */
        @Schema(description = "登录密码（密文）")
        private String password;
        /** 密码过期时间（90天后提醒） */
        @Schema(description = "密码过期时间（90天后提醒）")
        private LocalDateTime passwordExpireTime;
        /** 帐号状态：0-禁用，1-正常，2-锁定 */
        @Schema(description = "帐号状态：0-禁用，1-正常，2-锁定")
        private UserAccountStatus accountStatus;
        /** 帐号锁定原因 */
        @Schema(description = "帐号锁定原因")
        private String lockReason;
        /** 最后登录时间 */
        @Schema(description = "最后登录时间")
        private LocalDateTime lastLoginTime;
        /** 最后登录IP，为兼容IPV6，长度39 */
        @Schema(description = "最后登录IP，为兼容IPV6，长度39")
        private String lastLoginIp;
        /** 连续登录失败次数 */
        @Schema(description = "连续登录失败次数")
        private Byte loginFailCount;
        /** 最后登录失败时间 */
        @Schema(description = "最后登录失败时间")
        private LocalDateTime loginFailTime;
        /** 多因素认证状态：0-未开启，1-已开启 */
        @Schema(description = "多因素认证状态：0-未开启，1-已开启")
        private UserAccountMfaStatus mfaStatus;
        /** 多因素认证密钥 */
        @Schema(description = "多因素认证密钥")
        private String mfaSecret;
        /** 账号有效期 */
        @Schema(description = "账号有效期")
        private LocalDateTime accountExpireTime;
        /** 登录设备 */
        @Schema(description = "登录设备")
        private String loginChannel;

    }

    /**
     * 员工账户 接收部分更新参数及校验
     * @author suxch
     * @since 2025-08-21 05:08:55
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @Schema(description = "员工账户 接收部分更新参数及校验")
    public static class UpdatePartialDTO extends BaseDTO {

        /** 登录用手机号 */
        @Schema(description = "登录用手机号")
        private String loginMobile;
        /** 登录用邮箱 */
        @Schema(description = "登录用邮箱")
        private String loginEmail;
        /** 密码过期时间（90天后提醒） */
        @Schema(description = "密码过期时间（90天后提醒）")
        private LocalDateTime passwordExpireTime;
        /** 帐号锁定原因 */
        @Schema(description = "帐号锁定原因")
        private String lockReason;
        /** 最后登录时间 */
        @Schema(description = "最后登录时间")
        private LocalDateTime lastLoginTime;
        /** 最后登录IP，为兼容IPV6，长度39 */
        @Schema(description = "最后登录IP，为兼容IPV6，长度39")
        private String lastLoginIp;
        /** 连续登录失败次数 */
        @Schema(description = "连续登录失败次数")
        private Byte loginFailCount;
        /** 最后登录失败时间 */
        @Schema(description = "最后登录失败时间")
        private LocalDateTime loginFailTime;
        /** 多因素认证状态：0-未开启，1-已开启 */
        @Schema(description = "多因素认证状态：0-未开启，1-已开启")
        private UserAccountMfaStatus mfaStatus;
        /** 多因素认证密钥 */
        @Schema(description = "多因素认证密钥")
        private String mfaSecret;
        /** 账号有效期 */
        @Schema(description = "账号有效期")
        private LocalDateTime accountExpireTime;
        /** 登录设备 */
        @Schema(description = "登录设备")
        private String loginChannel;
        /** 创建人ID，仅平台超管可操作 */
        @Schema(description = "创建人ID，仅平台超管可操作")
        private Long createUserId;

    }

}